package com.itany.corejava.code07_常用类.string;

import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.Arrays;

/**
 * @author MissChen
 * @date 2024年02月29日 10:55
 */
public class Test07_字符集 {
    public static void main(String[] args) throws UnsupportedEncodingException {
        // test01();
        // test02();
        // test03();
        // test04();
        test05();
    }

    public static void test01() {
        // System.out.println(System.getProperties());
        System.out.println("当前系统所使用的字符集为:" + System.getProperty("file.encoding"));
        System.out.println("JVM默认使用的字符集:" + Charset.defaultCharset());
    }

    //编码
    public static void test02() throws UnsupportedEncodingException {

        // alt+enter
        String s = "您好";
        // 通过getBytes(Charset charset)方法对指定字符串进行编码，将结果存储到一个新的 byte 数组中。
        byte[] bytes = s.getBytes("GBK");
        // 对于GBK编码，一个中文占2个字节
        System.out.println(Arrays.toString(bytes));

        // 对于UTF-8编码，一个中文占3个字节
        byte[] bytes2 = s.getBytes("UTF-8");
        System.out.println(Arrays.toString(bytes2));


    }

    //解码
    public static void test03() throws UnsupportedEncodingException {
        byte[] bytes = {-60, -6, -70, -61};

        //使用GBK字符集进行解码
        String s = new String(bytes, "GBK");
        System.out.println(s);

        byte[] bytes2 = {-26, -126, -88, -27, -91, -67};

        //使用UTF-8字符集进行解码
        String s2 = new String(bytes2, "UTF-8");
        System.out.println(s2);

        String s3 = new String(bytes2);//使用的系统默认的字符集进行编码
        System.out.println(s3);

    }


    //乱码
    public static void test04() throws UnsupportedEncodingException {
        String s = "您好";

        // 编码->使用GBK进行编码
        byte[] bytes = s.getBytes("GBK");
        System.out.println(Arrays.toString(bytes));

        // 解码->使用ISO-8859-1解码
        String s2 = new String(bytes, "ISO-8859-1");
        // 由于编码与解码所采用的规则不一样，所以产生了乱码
        System.out.println(s2);

        //乱码的解决方式
        // 由于解码时使用的是ISO-8859-1,与编码字符不一致
        // 则再次重新编码，编码时使用之前解码时所采用的编码
        byte[] bytes2 = s2.getBytes("ISO-8859-1");
        System.out.println(Arrays.toString(bytes2));

        String s3 = new String(bytes2, "GBK");
        System.out.println(s3);
    }

    public static void test05() throws UnsupportedEncodingException {
        String s = "您好";

        // 编码->使用GBK进行编码
        byte[] bytes = s.getBytes("GBK");//编码
        System.out.println(Arrays.toString(bytes));

        String s2=new String(bytes,"UTF-8");//解码
        System.out.println(s2);//乱码

        // 2个中文->GBK4个字节->UTF-8解码乱码->UTF-8编码字节数不对
        byte[] bytes2=s2.getBytes("UTF-8");//编码
        System.out.println(Arrays.toString(bytes2));
    }


}
